#!/usr/bin/env python
# -*- coding: utf-8 -*- 

#Kiwi Bot
#Make by @nge1nCorsic4 in 2010
#Modified by @nge1nCorsic4 in 2011


#This program is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.

#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.

#You should have received a copy of the GNU General Public License along
#with this program; if not, write to the Free Software Foundation, Inc.,
#51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

import glob, os, traceback, time, sys, urllib2

def start_install():
	clean_screen()
	path_install = sys.path[0]
	slash = os.sep
	hasKiwi = False
	if os.path.isdir(path_install+slash+'kiwi') :
		print '    ---------------------------------------------------------------------'
		print '   |   L\'installateur detecte la presence du bot sur votre serveur !!    |'
		print '   | Attention les fichiers present seront ecrases, meme les fichiers de |'  
		print '   |  configuration ! Faites une sauvegarde avant, en cas de besoin....  |'
		print '    ---------------------------------------------------------------------\n'
		hasKiwi = True
		reponse = raw_input('- Voulez-vous quand meme continuer ? [o/n](Defaut = o): ')
		if reponse == 'n' :
			sys.exit()
	return hasKiwi
def clean_screen():
	if os.name =='nt':
		r = os.system('cls')
	else:
		r = os.system('clear')
	print '\n\n'
def request(page):
	req = urllib2.Request(page)
	handle = urllib2.urlopen(req)
	return handle.read()
def download_repo(hasKiwi):
	repo = 'http://kiwi.clan-fun.fr/depot/kiwi_V3_match/'
	dl_error = []
	slash = os.sep
	if os.name == 'nt' :
		path_install = sys.path[0]+slash
	else:
		path_install = ''
	try:
		list = 'list_full.txt'
		if hasKiwi :
			clean_screen()
			reponse = raw_input('- Voulez-vous ecraser les fichiers de configuration existant ? [o/n](Defaut = n): ')
			if reponse == 'n' or len(reponse) < 1:
				list = 'list_noconf.txt'
		liste = request(repo + list)
	except urllib2.HTTPError:
		print '*Erreur lors du telechargement du fichier de definition. Assurez-vous d\'avoir entre l\'adresse du depot correctement. Si vous avez utilise le depot par defaut, veuillez contacter un developpeur.'
		sys.exit()
	time.sleep(1)
	print '\n\n\n\n\n\n'
	print '----------------------------------------------------------------------\n'
	print 'Telechargement des fichiers de Kiwi, cela peut prendre un peu de temps...\n'
	print '----------------------------------------------------------------------\n\n\n'
	liste = liste.split(';')
	for i in liste:
		i = i.replace('\n','')
		if '\\' in i:
			path = i.split('\\')
			cp = ''
			for p in path[:-1]:
				cp += p+slash
				if os.path.isdir(path_install+cp) == False:
					os.mkdir(path_install+cp)
		try:
			i = i.replace('\\','/')
			content = request(repo+i)
			if os.name == 'nt' :
				i = i.replace('/',slash)
			if os.path.isfile(path_install+i):
				f = file(path_install+i,'r')
				data = f.read()
				f.close()
				if content == data:
					continue
			f = file(path_install+i,'w')
			f.write(content)
			f.close()
			print '  Fichier \"%s\" mis a jour.' %(i)
		except urllib2.HTTPError:
			if os.path.isdir(path_install+i) == False:
				dl_error.append(i)
		except IOError:
			print '*Erreur lors de l\'ecriture du fichier %s. Il est probable que vous n\'ayez pas les droits d\'ecriture dans le dossier choisi.' %(i)
			sys.exit()
	return 	dl_error
def update(hasKiwi):
	dl_error = download_repo(hasKiwi)
	if len(dl_error) > 0 :
		if len(dl_error[0]) > 0 :
			print '\n\n\n\nLes fichiers suivants n\'ont pas pu etre telecharger correctement :'
			for i in dl_error:
				print ' ' + i
			cont = raw_input('Voulez vous vraiment continuer [o/n](Defaut = n) : ')
			if cont != 'o':
				print 'Erreur pendant le telechargement des fichiers, abandon.'
				sys.exit()
		else:
			print '\n\n\n\nKiwi a ete telecharge avec succes!\n'
	else:
		print '\n\n\n\nKiwi a ete telecharge avec succes!\n'
	time.sleep(2)
def accueil():
	print '\n\n'
	print '______________________________'
	print '___________________________________'
	print '________________________________________'
	print '_______________________________________________'
	print '_______________________________________________________'
	print '_______________'
	print'________________	Bienvenue dans l\'installateur de Kiwi.'
	print '_______________________________________________'
	print '________________________________________'
	time.sleep(3)
	while 1 :
		clean_screen()
		print 'Que voulez-vous faire ?\n-----------------------\n\n'
		print '1) Installer KIWI V2 sur votre serveur. (Simplifier)'
		print '2) Installer KIWI V2 et configurer tous les plugins. (Avancer)'
		print '3) Faire simplement une mise a jour.'
		print '4) Configurer le bot. (Simplifier)'
		print '5) Configurer le bot et ces plugins. (Avancer)'
		print '6) Quitter !'
		print '\n\n'
		reponse = raw_input('Faite votre choix et taper un chiffre de 1 a 6  : ')
		if reponse.isdigit() and int(reponse) > 0 and int(reponse) < 7:
			break
		else:
			clean_screen()
			print 'Le chiffre ne fait pas parti de la liste, recommencez svp !!'
			time.sleep(2)
	return int(reponse)
def rose():
	clean_screen()
	print '_______________@ @______'
	print '_____________@@__@_@@@____'
	print '_____________@__@@_____@___'
	print '____________@@_@__@_____@____'
	print '___________@@@_____@@___@@@@@_'
	print '__________@@@@______@@_@____@@_'
	print '_________@@@@_______@@______@_______'
	print '_________@@@@_______@_______@_________________'
	print '_________@@@@@_____@_______@____________________________'
	print '__________@@@@@____@______@_______________________________________'
	print '___________@@@@@@@______@_____________________________________________________'
	print '__@@@_________@@@@@_@_________  ___     ___      ______              ___      '
	print '@@@@@@@________@@_____________ @   @   @   @    @      @ @      @   @   @    @'
	print '_@@@@@@@_______@______________ @    @  @    @   @      @ @      @  @     @   @'
	print '__@@@@@@_______@@_____________ @   @   @   @    @      @ @      @ @       @  @'
	print '___@@_____@_____@_____________ @--@    @--@     @------@ @      @ @       @  @'
	print '____@______@____@_____@_@@____ @   @   @   @    @      @ @      @ @       @  @'
	print '_______@@@@_@__@@_@_@@@@@_____ @    @  @    @   @      @ @      @ @       @  @' 
	print '_____@@@@@@_@_@@__@@@@@@@_____ @     @ @     @  @      @ @      @ @       @  @'
	print '____@@@@@@@__@@______@@@@@____ @    @  @     @  @      @  @    @   @     @    '
	print '____@@@@@_____@_________@@@___ @___@   @     @  @      @   @__@     @___@    @'
	print '____@@_________@__________@___________________________________________________'
	print '_____@_________@__________________________________________________'
	print '_______________@_______________________________________'
	print '____________@_@_______________________________'
	print '_____________@@_@___________________'
	time.sleep(3)
def affiche():
	clean_screen()
	print '           --------------------------------------------------'
	print '          |   Pour chaque question, laissez vide en tapant   |'
	print '          |      sur \"Entree\" pour garder la valeur        |'  
	print '          |           par defaut entre guillemets.           |'
	print '           --------------------------------------------------\n'
def configuration(avanced=None):
	clean_screen()
	slash = os.sep
	path = 'kiwi'+slash+'conf'+slash
	confPath = []
	source = glob.glob(path+'*')
	for a in source:
		if not os.path.isdir(a):
			confPath.append(a)
	serv = []
	for a in confPath:
		a = a.split(slash)
		serv.append(a[-1])
	serv = ', '.join(serv)
	if len(confPath) > 1:
		print 'Plusieurs fichiers de configuration ont ete trouves :'
		print serv
		serverFile = raw_input('Lequel voulez vous configurer ? :( Defaut = kiwi.cfg ) : ')
		if not serverFile :
			serverFile = 'kiwi.cfg'
	else:
		serverFile = 'kiwi.cfg'
	affiche()
	print 'Vous allez maintenant configurer le fichier : %s'%serverFile
	print '\n\n\n'
	if avanced :
		Getconfig_adv(path+serverFile)
	else:
		print path+serverFile
		Getconfig_spf(path+serverFile)
		return
	data = readLines(path+serverFile)
	for a in data :
		if 'kiwidir' in a :
			kiwidir = a.split('=')[-1]
	clean_screen()
	reponse = raw_input('Voulez-vous configurer les plugins correspondant a ce serveur ? [o/n]( Defaut = o ): ')
	if reponse == 'o' or len(reponse) < 1 :
		kiwidir = kiwidir.strip()
		cible = glob.glob(path+kiwidir+slash+'*')
		if cible :
			for a in cible:
				clean_screen()
				plugin = a.split(slash)[-1]
				reponse = raw_input('Voulez vous configurer le plugin %s ? [o/n]( Defaut = o ): '%plugin)
				if reponse == 'o' or len(reponse) < 1 :
					affiche()
					print '\n\n\n'
					print 'Vous allez maintenant configurer le fichier : %s'%plugin
					print '\n\n\n'
					Getconfig_adv(a)
		else:
			print 'Erreur l\'installateur ne trouve aucun fichier de configuration des plugins !!'
			print 'Relancer l\'installateur et laisser les chemins par defaut.'
			sys.exit()
def readLines(confPath):
	f = open(confPath, 'r')
	data = f.readlines()
	f.close()
	return data
def writeConfig(Path, data):
	try:
		f = open(Path, 'w')
		f.write(data)
		f.close()
		time.sleep(1)
	except Exception :
		print '\n'
		print 'Critical error : \n'
		print traceback.format_exc().strip()
		print '\n'
		time.sleep(10)
def Getconfig_spf(Path):
	print '+ Quel est le nom de votre bot?'
	cfg_name = raw_input('[KiwiV2] : ')
	if not cfg_name :
		cfg_name = 'KiwiV2'
	
	print '+ Quelle est l\'ip du serveur?'
	cfg_ip = raw_input('[localhost] : ')
	if not cfg_ip :
		cfg_ip = 'localhost'
	print '+ Quel est le port du serveur?'
	cfg_port = raw_input('[27960] : ')
	if not cfg_port :
		cfg_port = '27960'
	print '+ Quelle est le rcon du serveur?'
	cfg_rcon = raw_input('[rcon] : ')
	if not cfg_rcon :
		cfg_rcon = ''
	print '+ Ou se situe le fichier de log du serveur UrT?'
	cfg_log_game = os.path.expanduser(raw_input('[~/.q3a/q3ut4/games.log] : '))
	if not cfg_log_game :
		cfg_log_game = os.path.expanduser('~/.q3a/q3ut4/games.log')
	conf = readLines(Path)
	list = ''
	ok = 0
	for data in conf :
		if len(data) < 2 :
			list += data
		elif 'name' == data.split()[0] :
			if ok == 0:
				list += 'name = '+cfg_name+'\n'
				ok = 1
			else:
				list += data
		elif 'ip' == data.split()[0] :
			list += 'ip = '+cfg_ip+'\n'
		elif 'port' == data.split()[0] :
			list += 'port = '+cfg_port+'\n'
		elif 'rcon' == data.split()[0] :
			list += 'rcon = '+cfg_rcon+'\n'
		elif 'log_game' == data.split()[0] :
			list += 'log_game = '+cfg_log_game+'\n'
		else:
			list += data
	writeConfig(Path, list)
def Getconfig_adv(Path):
	count = len(readLines(Path))
	f = open(Path, 'r')
	list = 0
	data = ''
	while list < count :
		try:
			list += 1
			a = f.readline()
			if a[0] == '[' :
				data += a
			elif a == '\n' :
				data += a
				print '\n'
			elif a[0] == '#' :
				data += a
				print a[:-1]
				list += 1
				b = f.readline()
				b = b.split('=')
				function = raw_input(b[0]+'( Defaut ='+b[1][:-1]+' ) : ')
				if len(function) > 0:
					if b[0] == 'kiwidir ':
						loc = b[1][:-1].split()[0]
						renameDir = os.path.dirname(Path)
						oldDir = renameDir+os.sep+loc
						dir = renameDir+os.sep+function
						print 'Dossier %s renommer en %s !'%(oldDir,dir)
						os.rename(oldDir, dir)
						time.sleep(0.5)
					data += b[0]+'= '+function+'\n'
				else:
					data += '='.join(b)
			else:
				b = a.split('=')
				function = raw_input(b[0]+'( Defaut ='+b[1][:-1]+' ) : ')
				if len(function) > 0:
					data += b[0]+'= '+function+'\n'
				else:
					data += '='.join(b)
		except Exception :
			print '\n'
			print 'Critical error : \n'
			print traceback.format_exc().strip()
			print '\n'
			sys.exit()
	f.close()
	clean_screen()
	print data
	print '\n\n\n'
	reponse = raw_input('Verifiez les informations remplies, sont-elles correctes ? [o/n](Defaut = o):')
	if reponse == 'n' :
		affiche()
		print '\n\n\n'
		Getconfig_adv(Path)
	else:
		print 'Ecriture du fichier de configuration...'
		print '\n\n\n'
		writeConfig(Path, data)

################################### Demarrage du setup ##############################

choix = accueil()

if choix in (1,2) :
	haskiwi = start_install()
	update(haskiwi)
	if choix == 1 :
		configuration()
	else:
		configuration('avanced')
elif choix == 3 :
	update(True)
elif choix in (4,5) :
	if choix == 4 :
		configuration()
	else:
		configuration('avanced')
else :
	sys.exit()

rose()
clean_screen()

print '          La configuration du bot c\'est terminee correctement !'
print '          ----------------------------------------------------\n\n'
print 'Pour le lancer, vous pouvez utiliser la commande suivante :\n'
path_install = sys.path[0]
slash = os.sep
if os.name == 'nt' :
	print 'c:\python27\python ' + path_install + slash + 'run.py'
else:
	print '$ screen -S KIWI python ' + path_install + slash + 'run.py'
print '\n\nEnsuite, rendez-vous sur votre serveur et tapez la commande !iamgod pour vous enregistrer en tant qu\'administrateur pour le bot.'
print 'N\'oubliez pas ensuite de mettre le parametre \'god\' a \'no\' dans le fichier kiwi/conf/admin.cfg pour eviter que quelqu\'un d\'autre que vous ne devienne admin a votre place.'
print '\nEnfin, prenez soin de mettre regulierement votre bot a jour en relancant le setup.py et en choisissant l\'option "3" du menu (eteignez d\'abord le bot pour faire cette operation).\n'
print '\n\n\n'
raw_input('Appuyez sur \"Entree\" pour quitter !!')
print '\n'